#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
import time
import re
import datetimeDemo as tsLog

def stringFromToArray():
    print("\nstringFromToArray")
    month = [
        "January",
        "February",
        "March",
        "April",
        "May",
        "June",
        "July",
        "August",
        "September",
        "October",
        "November",
        "December"]

    strJoined = '-'.join(month)
    print("strJoined", strJoined)

    strJoined += '-Test'
    arr = strJoined.split('-')
    print("array splited", arr)


def stringJoin():
    print("\nstringJoin")

    part1 = "七律·长征"
    part2 = "毛泽东"
    part3 = "1935年10月"
    part4 = "红军不怕远征难，万水千山只等闲。"
    part5 = "五岭逶迤腾细浪，乌蒙磅礴走泥丸。"
    part6 = "金沙水拍云崖暖，大渡桥横铁索寒。"
    part7 = "更喜岷山千里雪，三军过后尽开颜。"

    # 使用+号连接
    print("plus join:"+"\n"+part1+"\n"+part2+"\n"+part3+"\n"+part4+"\n"+part5+"\n"+part6+"\n"+part7)

    # 使用 % 格式化
    print("\n%% format join:\n%s\n%s\n%s\n%s\n%s\n%s\n%s" % (part1, part2, part3, part4, part5, part6, part7))

    # f-string 是 python3.6 之后版本添加的，称之为字面量格式化字符串，是新的格式化字符串的语法。
    print(f"\nf-string join:\n{part1}\n{part2}\n{part3}\n{part4}\n{part5}\n{part6}\n{part7}")

    multiLineStr = "七律·长征\
毛泽东\
1935年10月\
红军不怕远征难，万水千山只等闲。\
五岭逶迤腾细浪，乌蒙磅礴走泥丸。\
金沙水拍云崖暖，大渡桥横铁索寒。\
更喜岷山千里雪，三军过后尽开颜。"
    print("multiLine code, but oneline Str:", multiLineStr)

    multiLineStr = """七律·长征
    毛泽东
    1935年10月
    红军不怕远征难，万水千山只等闲。
    五岭逶迤腾细浪，乌蒙磅礴走泥丸。
    金沙水拍云崖暖，大渡桥横铁索寒。
    更喜岷山千里雪，三军过后尽开颜。"""
    print("3\" multiLine str", multiLineStr)

def subStringSearchReplace():
    print("\nsubStringSearchReplace")
    ostr = "浔阳江头夜送客，枫叶荻花秋瑟瑟。主人下马客在船，举酒欲饮无管弦。醉不成欢惨将别，别时茫茫江浸月。忽闻水上琵琶声，主人忘归客不发。寻声暗问弹者谁，琵琶声停欲语迟。移船相近邀相见，添酒回灯重开宴。千呼万唤始出来，犹抱琵琶半遮面。转轴拨弦三两声，未成曲调先有情。弦弦掩抑声声思，似诉平生不得志。低眉信手续续弹，说尽心中无限事。轻拢慢捻抹复挑，初为《霓裳》后《六幺》。大弦嘈嘈如急雨，小弦切切如私语。嘈嘈切切错杂弹，大珠小珠落玉盘。间关莺语花底滑，幽咽泉流冰下难。冰泉冷涩弦凝绝，凝绝不通声暂歇。别有幽愁暗恨生，此时无声胜有声。银瓶乍破水浆迸，铁骑突出刀枪鸣。曲终收拨当心画，四弦一声如裂帛。东船西舫悄无言，唯见江心秋月白。沉吟放拨插弦中，整顿衣裳起敛容。自言本是京城女，家在虾蟆陵下住。十三学得琵琶成，名属教坊第一部。曲罢曾教善才服，妆成每被秋娘妒。五陵年少争缠头，一曲红绡不知数。钿头银篦击节碎，血色罗裙翻酒污。今年欢笑复明年，秋月春风等闲度。弟走从军阿姨死，暮去朝来颜色故。门前冷落鞍马稀，老大嫁作商人妇。商人重利轻别离，前月浮梁买茶去。去来江口守空船，绕船月明江水寒。夜深忽梦少年事，梦啼妆泪红阑干。我闻琵琶已叹息，又闻此语重唧唧。同是天涯沦落人，相逢何必曾相识！我从去年辞帝京，谪居卧病浔阳城。浔阳地僻无音乐，终岁不闻丝竹声。住近湓江地低湿，黄芦苦竹绕宅生。其间旦暮闻何物？杜鹃啼血猿哀鸣。春江花朝秋月夜，往往取酒还独倾。岂无山歌与村笛？呕哑嘲哳难为听。今夜闻君琵琶语，如听仙乐耳暂明。莫辞更坐弹一曲，为君翻作《琵琶行》。感我此言良久立，却坐促弦弦转急。凄凄不似向前声，满座重闻皆掩泣。座中泣下谁最多？江州司马青衫湿。"

    # [:]    截取字符串中的一部分，遵循左闭右开原则
    print("ostr[1:10]", ostr[1:10])

    if "琵琶" in ostr:
        print("find 琵琶 in ostr, 出现的次数", ostr.count("琵琶"))
        print("琵琶 第一次出现的下标", ostr.find("琵琶"))
        print("琵琶 最后一次出现的下标", ostr.rfind("琵琶"))

        ostr = ostr.replace("琵琶", "pipa")
        print("琵琶 全部替换为 pipa", ostr)

        if "琵琶" in ostr:
            print("find 琵琶 in ostr, 出现的次数", ostr.count("琵琶"))
        else:
            print("没有 find 琵琶 in ostr")
            ostr = ostr.replace("pipa", "琵琶", 3)
            print("替换3次后，find 琵琶 in ostr, 出现的次数", ostr.count("琵琶"))


def regexSearchReplace():
    # https://www.runoob.com/python3/python3-reg-expressions.html#flags
    print("\nregexSearchReplace")
    ostr = "百科熊猫词条  https://baike.baidu.com/item/%E5%A4%A7%E7%86%8A%E7%8C%AB/34935?fromtitle=%E7%86%8A%E7%8C%AB&fromid=162918&fr=aladdin  panda@163.com 大熊猫（学名：Ailuropoda melanoleuca）：属于食肉目、熊科、大熊猫亚科和大熊猫属唯一的哺乳动物，头躯长1.2-1.8米，尾长10-12厘米。体重80-120千克，最重可达180千克，体色为黑白两色，它有着圆圆的脸颊，大大的黑眼圈，胖嘟嘟的身体，标志性的内八字的行走方式，也有解剖刀般锋利的爪子。是世界上最可爱的动物之一。panda@gmail.com  com.panda@gmail (010)88886666 ，或 022-22334455，或 0571-22334455，或 02912345678 511122198812068932 41112219881206893X 18660000062或 17000000026"

    # 身份证
    idPattern = r'(\d{17}|\d{14})(\d|[xX])'

    # 电话号码：eg：021-68686868 0511-6868686
    phonePattern = r'(0\d{2,3}-|\(0\d{2,3}\))(\d{7,8})'

    # 手机
    mobilePhonePattern = r'(^|\D)(1\d{10})(\D|$)'

    # 邮箱
    emailPattern = "[a-zA-Z0-9]\w*@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}"

    # url
    urlPattern = "(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"

    # matchRes = re.match(mobilePhonePattern, ostr)

    # re.match 尝试从字符串的起始位置匹配一个模式，如果不是起始位置匹配成功的话，match() 就返回 none。
    print("match 邮箱:\t\t",      emailPattern, '\t\t-->',                                  re.match(emailPattern, ostr))
    print("match 邮箱:\t\t",      f".*{emailPattern}.*", '\t-->',                           re.match(f".*{emailPattern}.*", ostr))
    print("match 身份证:\t",       f".*{idPattern}.*", '\t\t\t\t\t\t-->',                   re.match(f".*{idPattern}.*", ostr))
    print("match 电话号码:\t",     f".*{phonePattern}.*", '\t\t\t\t\t-->',            re.match(f".*{phonePattern}.*", ostr))
    print("match 手机:\t\t",      f".*{mobilePhonePattern}.*", '\t\t\t\t\t\t\t\t\t\t-->',   re.match(f".*{mobilePhonePattern}.*", ostr))
    print("match URL:\t\t",      f".*{urlPattern}.*", '\t\t\t\t\t\t\t\t\t\t-->',   re.match(f".*{mobilePhonePattern}.*", ostr))

    # re.search 匹配整个字符串，直到找到一个匹配。
    # re.search 的返回值是一个 re.Match 对象，它的 group方法返回 分组信息，span返回 起始终止位置
    # 使用小括号指定一个子表达式后，匹配这个子表达式的文本(也就是此分组捕获的内容) 会自动拥有一个组号，规则是：从左向右，以分组的左括号为标志
    # 分组group(0)对应整个正则表达式，第一个出现的分组的组号为group(1)，第二个为group(2)，以此类推。
    # span 和 group 类似
    print("search 邮箱",      re.search(emailPattern, ostr))
    print("search 身份证",     re.search(idPattern, ostr))
    print("search 电话号码 groups",   re.search(phonePattern, ostr).groups())
    print("search 电话号码 group(0)", re.search(phonePattern, ostr).group())
    print("search 电话号码 group(1)",   re.search(phonePattern, ostr).group(1))
    print("search 电话号码 group(2)", re.search(phonePattern, ostr).group(2))
    print("search 电话号码 span", re.search(phonePattern, ostr).span())
    print("search 电话号码 span(1)", re.search(phonePattern, ostr).span(1))
    print("search 电话号码 span(2)", re.search(phonePattern, ostr).span(2))
    print("search 手机",      re.search(mobilePhonePattern, ostr))
    print("search URL",      re.search(urlPattern, ostr))

    # findall 找到正则表达式所匹配的所有子串，并返回一个列表
    # 如果有多个匹配模式，则返回元组列表，如果没有找到匹配的，则返回空列表
    # 如果没有 分组的正则，这个函数的返回值好用。有分组的正则，这个函数的返回值就 鸡肋，有分组的正则 用finditer 获取所有的配置，如下面的例子
    print("findall 邮箱",      re.findall(emailPattern, ostr))
    print("findall 身份证",    re.findall(idPattern, ostr))
    print("findall 电话号码",   re.findall(phonePattern, ostr))
    print("findall 手机",      re.findall(mobilePhonePattern, ostr))
    print("findall URL",      re.findall(urlPattern, ostr))

    # 在字符串中找到正则表达式所匹配的所有子串，并把它们作为一个迭代器返回
    reIter = re.finditer(phonePattern, ostr)
    loop = 0
    for matchRes in reIter:
        print(loop, "finditer 电话号码", matchRes.group())
        print(loop, "finditer 电话号码 g1", matchRes.group(1))
        print(loop, "finditer 电话号码 g2", matchRes.group(2))
        loop += 1

    reIter = re.finditer(mobilePhonePattern, ostr)
    loop = 0
    for matchRes in reIter:
        print(loop, "finditer 手机", matchRes.group())
        print(loop, "finditer 手机 g1", matchRes.group(2))
        loop += 1

    # re模块提供了re.sub用于替换字符串中的匹配项。
    rstr = re.sub(emailPattern, '____邮箱____', ostr)
    print("匹配替换 邮箱\n", rstr)
    rstr = re.sub(mobilePhonePattern, '____手机____', rstr)
    print("匹配替换 手机\n", rstr)
    rstr = re.sub(urlPattern, '____URL____', rstr)
    print("匹配替换 URL\n", rstr)
    rstr = re.sub(idPattern, '____身份证____', rstr)
    print("匹配替换 身份证\n", rstr)

    # re.sub 匹配后 调用 替换函数
    rstr = re.sub(phonePattern, rpFunc, rstr)
    print("匹配电话号码 + 替换函数rpFunc\n", rstr)

def rpFunc(matched):
    quhao = matched.group(1)
    quhao = re.sub(r'\D', '', quhao)
    hao = matched.group(2)
    if '010' == quhao:
        return f"北京电话->{hao}"
    if '022' == quhao:
        return f"天津电话->{hao}"
    return f"{quhao}->{hao}"

def stringTrim():
    print("\nstringTrim")
    ostr = " \t 2sapce+1tab 山外青山楼外楼 3space   "
    trimstr = ostr.strip()
    leftTrimstr = ostr.lstrip()
    rightTrimstr = ostr.rstrip()
    print(f"ostr        :|{ostr}|\ntrimstr     :|{trimstr}|\nleftTrimstr :|{leftTrimstr}|\nrightTrimstr:|{rightTrimstr}|")
'''
输入如下
ostr        :| 	 2sapce+1tab 山外青山楼外楼 3space   |
trimstr     :|2sapce+1tab 山外青山楼外楼 3space|
leftTrimstr :|2sapce+1tab 山外青山楼外楼 3space   |
rightTrimstr:| 	 2sapce+1tab 山外青山楼外楼 3space|
'''

def stringFormat():
    print("\nstringFormat")
    # 字符串格式化使用与 C 中 sprintf 函数一样的语法。
    # http://c.biancheng.net/view/159.html
    # https://blog.csdn.net/K346K346/article/details/52252626

    # 整数
    i=30122121
    print("%%d,%%#o,%%#x,%%#X --> %d,%#o,%#x,%#X\n" % (i, i, i, i))

    # 浮点数
    fl = 2.566545445
    dl = 265.5651445
    print("%%f,%%e,%%g,%%.7f(fl,dl,dl,dl) --> %f,%e,%g,%.7f\n"% (fl, dl, dl, dl))
    print("%%f,%%E,%%G,%%f(fl,dl,dl,dl) --> %f,%E,%G,%f\n"% (fl, dl, dl, dl))
    print("%%.8f,%%.10e(fl,dl) --> %.8f,%.10e\n"% (fl, dl))
    print("%%.8e,%%.10f(fl,dl) --> %.8e,%.10f\n"% (fl, dl))

    # 字符串
    s = "Hello world!(size=21)"
    print("%s -- %%30s  --> :%30s:\n" % (s, s))
    print("%s -- %%-30s --> :%-30s:\n" % (s, s))
    print("%s -- %%30.10s  --> :%30.10s:\n" % (s, s))
    print("%s -- %%-30.10s --> :%-30.10s:\n" % (s, s))

def specialUse():
    for i in range(101):
        print("\r{:3}%".format(i), end=' ')  # /r 将回到行首开始填充
        time.sleep(0.05)
        break

def demo():
    tsLog.logTs("stringDemo", preNewLineNum=2)

    stringFromToArray()
    stringJoin()
    subStringSearchReplace()
    stringTrim()
    stringFormat()
    specialUse()
    regexSearchReplace()

if __name__ == '__main__':
    demo()
